#ifndef __M_UTIL_H__
#define __M_UTIL_H__

#include <iostream>
#include <string>
#include <ctime>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>

/*
  1.获取系统时间
  2.判断文件是否存在
  3.获取文件所在的目录路径
  4.创建目录
*/

namespace my_log
{
  namespace util
  {
    class Date
    {
    public:
      static size_t now()
      {
        return (size_t)time(nullptr);
      }
    };

    class File
    {
    public:
      // 判断文件是否存在
      static bool exists(const std::string &pathname)
      {
        // access系统调用不在windo下使用
        //  if(access(pathname.c_str(), F_OK) == 0) return true;
        //  else return false;

        // stat系统调用支持Linux、window平台使用
        struct stat st; // st是输出型参数
        if (stat(pathname.c_str(), &st) == 0)
          return true;
        else
          return false;
      }

      // 获取文件所在的目录路径
      static std::string path(const std::string &pathname)
      {
        size_t pos = pathname.find_last_of("/\\"); // 从前往后找文件分隔符
        if (pos == std::string::npos)// 没有上级目录
          return "."; 
        // 找到对应的文件路径，除去本文件名称，将路径分割返回
        return pathname.substr(0, pos + 1);
      }

      // 创建目录
      static void createDirectory(const std::string &pathname)
      {
        //./abc/edf/test
        size_t pos = 0, idx = 0;
        while (idx < pathname.size())
        {
          // 子目录被父目录层层包裹，先找最开始的目录，看是否存在
          pos = pathname.find_first_of("/\\", idx);

          // 没有上级目录
          if (pos == std::string::npos)
            mkdir(pathname.c_str(), 0777);

          // 存在上级目录
          std::string parent_dir = pathname.substr(0, pos + 1);
          if (exists(parent_dir) == true)
          {
            // 更新目标位置
            idx = pos + 1;
            continue;
          }
          // 创建上级目录
          mkdir(parent_dir.c_str(), 0777);
          idx = pos + 1;
        }
      }
    };
  }
}



#endif